Container Insights でコンテナ単位のCPU・メモリ使用率を表示させる方法
ちゃだいん(@chazuke4649)です。
Container Insightsの活用にあたり、ちょっとハマった箇所があったので共有します。
結論
- Container Insights を有効化しただけでは、コンテナ単位のCPU・メモリ平均使用率が表示されない場合がある
- タスク定義内のコンテナ定義にて、コンテナごとにCPUとメモリを指定して起動すると、Container Insightsで表示されるようになる
前提
まず、そもそも Container Insights については以下ブログや資料がわかりやすいです。
[Black Belt] Amazon CloudWatch Container Insights で始めるコンテナモニタリング入門
AmazonECS用のAmazonCloudWatch ContainerInsightsの紹介| AWS Management&Governanceブログ
疑問
ECS on Fargateで1つのタスク内に2つのコンテナが起動している環境で、コンテナ単位のリソース使用状況を確認する機会がありました。そのため、まず、Container Insightsを有効化し、CloudWatchコンソールから確認しようとしたところ、うまく表示されていませんでした。
左上で[ECS Tasks]を選択し、下の方にスクロールさせると
[Container performance]が表示されるが、肝心のCPU・メモリ平均使用率が表示されていません。
ちなみに、粒度を一つ上げて[ECS Service]を選択し、[Task performance]を見るとタスク単位では表示されます。
理由がわからずいろいろ試行錯誤した結果、原因は「コンテナ定義でコンテナごとのCPUとメモリの配分を指定していなかったので、平均使用率が表示できなかった」ということがわかりました。
解決方法
今回の場合、タスク定義でタスク自体のCPUとメモリは指定してましたが、コンテナnginx
php
とそれぞれの配分を指定していませんでした。そこを修正します。
タスク定義パラメータ - Amazon Elastic Container Service
修正方法はいろいろありますが、コンソール操作がビジュアル的にもわかりやすかったので、コンソールで行います。
まず、タスク定義の画面にて、既存のタスク定義から新しいリビジョンを作成します。
画面中部の以下の通り、現時点ではそれぞれのリソース配分が設定されていません。
ここで、各コンテナ定義を編集します。
以下2ヶ所にて、今回はメモリのソフトリミットMiBを256
、CPUユニット数を128
と、タスク単位で指定分のちょうど半分を指定します。
上記はnginx
の方のコンテナで、もう一つphp
の方も同様の設定を行います。
すると以下の通り、タスク単位のキャパシティが両コンテナに半分ずつ配分されたことがわかります。
編集箇所は以上で、タスク定義の新しいリビジョンを作成します。
新しいリビジョンを使用し、新しくタスクを起動します。
数分後、Container Insightsを確認すると、
[ECS Tasks]の画面の[Container performance]にて、CPU・メモリ平均使用率が表示されました。
おまけ
1タスク1コンテナの場合は?
今回のケースは1タスク2コンテナだったので、「タスクで使用可能なCPUとメモリ!=コンテナで使用可能なCPUとメモリ」ということでコンテナ単位が表示できなかった可能性もあると思いました。なので、「1タスク1コンテナかつコンテナ定義でCPUとメモリは指定しない」パターンも試してみました。
結果、表示されませんでした。
なので、1タスク内のコンテナ数にかかわらずコンテナ単位でCPU・メモリを指定していないと、コンテナ単位の平均使用率は表示できないようです。
別の方法は?
コンテナ定義で各コンテナの容量を指定しなくても、Logs Insightsを使えばコンテナ単位のメトリクスが取得可能です。詳しくは以下ブログをどうぞ。
CloudWatch Logs Insights でコンテナ単位のCPU・メモリ使用量などを確認する | DevelopersIO
終わりに
ドキュメントでこれらの記載を見つけられなかったので、本記事が同じような事象にひっかかった人のお役に立てば幸いです!
それではこの辺で。ちゃだいん(@chazuke4649)でした。